import { Queue } from "./queue";
import { QueueOverflowStrategy } from "./queue.enum";

/**
 * 阻塞队列（先进先出）
 */
export class BlockQueue<T> implements Queue<T> {
  // 队列
  private __queue: T[] = [];

  /**
   * 构造函数
   * @param __maxSize 队列最大长度
   * @param __overflowStrategy 溢出策略
   */
  constructor(
    private __maxSize = 0,
    private __overflowStrategy = QueueOverflowStrategy.DISCARD_HEAD,
  ) {}

  /**
   * 清空队列
   */
  clear(): void {
    this.__queue = [];
  }

  /**
   * 是否为空
   */
  isEmpty(): boolean {
    return this.__queue.length === 0;
  }

  /**
   * 添加元素
   * @param item
   */
  offer(item: T): void {
    if (this.__overflowHandler()) {
      this.__queue.push(item);
    }
  }

  /**
   * 溢出处理
   * @private
   */
  private __overflowHandler() {
    if (this.__maxSize <= 0) return true;
    if (this.size() < this.__maxSize) return true;
    if (this.__overflowStrategy === QueueOverflowStrategy.DISCARD_NEW) return false;
    if (this.__overflowStrategy === QueueOverflowStrategy.DISCARD_HEAD) this.__queue.shift();
    if (this.__overflowStrategy === QueueOverflowStrategy.DISCARD_TAIL) this.__queue.pop();
    return true;
  }

  /**
   * 查看栈顶元素
   */
  peek(): T {
    return this.__queue[0];
  }

  /**
   * 提取栈顶元素
   */
  poll(): T {
    return this.__queue.shift()!;
  }

  /**
   * 当前队列尺寸
   */
  size(): number {
    return this.__queue.length;
  }
}
